package org.atlantis.grosbeak.lang;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.regex.Matcher;

/**
 * 显示一个对象中的详细信息。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 */
public abstract class Details {

	/**
	 * 显示java.util.regex.Matcher中的详细信息。
	 * 
	 * @param m
	 *            Matcher对象
	 * @return 字符串化的详细信息。
	 */
	public static String matcher(Matcher matcher) {
		StringBuilder sb = new StringBuilder();
		if (matcher.find())
			for (int i = 0; i < matcher.groupCount(); i++)
				sb.append(String.format("%2d: %s\n", i, matcher.group(i)));
		else
			sb.append("No found!");
		return sb.toString();
	}

	/**
	 * 显示一个对象中所有的getter方法的返回值，和所有public属性的值。
	 * 
	 * @param obj
	 * @return
	 */
	public static String object(Object obj) {
		if (null == obj)
			return "null";
		StringBuilder sb = new StringBuilder();
		sb.append(obj.getClass().getName());
		Mirror<?> mirror = Mirror.me(obj.getClass());

		sb.append("\n\n[Fields:]");
		for (Field f : mirror.getMirrorType().getFields()) {
			if (Modifier.isPublic(f.getModifiers()))
				try {
					sb.append(String.format("\n\t%10s : %s", f.getName(), f
							.get(obj)));
				} catch (Exception e) {
					sb.append(String.format("\n\t%10s : %s", f.getName(), e
							.getMessage()));
				}
		}
		sb.append("\n\n[Methods:]");
		for (Method m : mirror.getMirrorType().getMethods()) {
			if (Modifier.isPublic(m.getModifiers()))
				if (m.getName().startsWith("get"))
					if (m.getParameterTypes().length == 0)
						try {
							sb.append(String.format("\n\t%10s : %s", m
									.getName(), m.invoke(obj)));
						} catch (Exception e) {
							sb.append(String.format("\n\t%10s : %s", m
									.getName(), e.getMessage()));
						}
		}
		return sb.toString();
	}
}
